因為我們試圖最小化成本函數,所以電腦會盡量在資料當中找到最好的權重。不過這對真實狀況來說其實不合理,為什麼呢?
舉例來說,當新的資料進來,我們很容易因為原本的模型太擬合,導致如果模型看到一個從來沒看過的資料,有可能會失準。
意思是說,模型過於擬合並不是一件好事囉?是的,這就像穿著一件緊身褲一樣,只有符合特定尺寸的寬度才穿得下。我們希望模型可以擬合更多沒有看過的資料。
以上提到的狀況叫做過擬合(overfitting)。雖然對於**訓練資料(training data)**有很好的效果,但對於沒看過的資料,卻有很差的結果。
我們通常會用正確率來幫一個模型打分數,正確率的定義為,在所有的 label 當中,我們預測中的 label 有多少:
$$
accuracy = prob(Y=prediction(X, weight))
$$
雖然模型可以非常完美地擬合已經出現過的資料,但在實務上我們想要做的並不是擬合已經出現過的資料(因為都已經有輸出結果了),而是面對不知道的資料時,仍然可以準確地預估結果為何。
所以,針對之前提到的兩個模型,線性迴歸與邏輯回歸,想要在模型中加入一些常數,讓這個模型可以更加泛化,更能擬合未知的資料。
跟過擬合不同,欠擬合是指雖然已經透過梯度下降來更新權重,卻仍然有很高的 error。有幾個原因可能造成欠擬合:
會產生 overfitting 有幾個可能原因:
為了避免這種情況,會加入正規化參數,通常都會用 $\lambda$ 來表示。而正規化的效果通常都能夠改善模型的準確率。
現在讓我們來看看線性回歸與邏輯回歸兩個模型的正規化項(regular term)
$$
cost(W)=\frac{1}{2m}\times[\sum_{i=1}^{m}(h(x_i) -y_{i})^2+\lambda\sum_{j=1}^{n}w_{j}^{2}]
$$
$$
cost(W)=[\frac{1}{m}\times\sum_{i=1}^{m}y_ilog(h(x_i)) + (1-y_i)log(1-h(x_i))]+\frac{\lambda}{2m}\sum_{j=1}^{n}w_j^2
$$
注意:$\lambda$ 有時會用 C 表示,定義為 $\lambda$ 的倒數
$$
C=\frac{1}{\lambda}
$$
這樣一來,每次訓練模型時,都可以讓模型不是那麼地擬合,也就可以適應更多未知的資料。他們的微分也相對簡單:
$$
\frac{1}{m}\times[\sum_{i=1}^{m}(h(x_i) -y_{i})\times x_i) +\lambda\sum_{j=1}^{n}w_{j}]
\
h(x)=w0x0+w1x1+...
$$
$$
\frac{1}{m}\times\sum_{i=1}^{m}[(y_{i}log(h(x_{i}))+(1-y_i)log(1-h(x_{i}))]+\frac{\lambda}{m}\sum_{j=0}^{n}w_{j}
$$
在前幾個例子當中,可以發現年份、薪水是個差距相當大的數字。例如:105 比上 50000,這在訓練模型時會因為數字相差太大而導致梯度下降的比較慢,雖然仍然可以找到正確的結果,但是效能比較差。如果相差在更大的話也有可能讓數字過大而直接 overflow。
所以我們通常會先用平均化的方式讓值的範圍縮在 -1 ~ 1 之間。
到目前為止,我們實驗的方式都是把所有資料(training data)拿去做訓練,然後就直接來預測結果了。不過這樣一來我們就沒辦法知道這個 model 到底準不準,也不知道該從哪裡調整參數才好。
因此在實務上,我們會把訓練資料分為三個部分:training set, test set, cross validation set
這是為了不讓模型先看過全部的資料,而是只用一部分的資料訓練,並觀察是否能在未知的資料上也有不錯的預測能力。通常分成:training set 80%, cross validation set: 10%, test set: 10%。(可根據資料大小做調整)
之後如果有時間,我會修改前兩個範例中的程式碼,加上正規項,來看看是否能夠增加準確率。